home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_2 / tools.exe / DOCS / MAKEROM.DOC next >
Text File  |  1991-07-19  |  24KB  |  793 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.                    Instructions for MS-DOS program "MAKEROM"
  9.  
  10.        *****************************************************************
  11.  
  12.                                      NOTICE
  13.  
  14.        Hewlett-Packard is making MAKEROM.EXE available to customers free
  15.        of charge to help them in HP 48SX application development, under
  16.        the following conditions:
  17.  
  18.  
  19.        *  The program MAKEROM.EXE and the documentation file MAKEROM.DOC
  20.           are provided "as is," and are subject to change without notice.
  21.           Hewlett-Packard Company make no warranty of any kind with
  22.           regard to the software or documentation, including, but not
  23.           limited to, the implied warranties of merchantability and
  24.           fitness for a particular purpose.  Hewlett-Packard Company
  25.           shall not be liable for any error or for incidental or
  26.           consequential damages in connection with the furnishing,
  27.           performance, or use of this software and documentation.
  28.  
  29.  
  30.        *  The program and documentation are copyrighted by Hewlett-
  31.           Packard.  Sale of this material is prohibited without prior
  32.           written permission of Hewlett-Packard Company.
  33.  
  34.  
  35.        *  The HP Customer Support department does not support MAKEROM.
  36.           Questions, comments, defect reports, etc. should be directed to
  37.           the Library Development conference on the HP Calculator
  38.           Bulletin Board System.  All responses from Hewlett-Packard will
  39.           normally be provided through that conference.
  40.  
  41.  
  42.        *  Software generated by MAKEROM.EXE should be tested and
  43.           qualified in its final form.
  44.  
  45.        Revised versions of the software and documentation will be posted
  46.        on the Bulletin Board as they become available.
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.                                    -1-
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.        1.  MAKEROM - Library Generator
  75.  
  76.        The RPL development tools RPLCOMP, SASM, and SLOAD may be used to
  77.        create individual code objects, but they do not easily support the
  78.        creation of a library object.  MAKEROM is a preprocessor that
  79.        reads a control file and external files (with the .ext extension)
  80.        generated by the RPL compiler, then generates the appropriate
  81.        header, hash, and end files for library generation with the Saturn
  82.        assembler and loader.
  83.  
  84.        Libraries are a collection of objects in a precompiled form that
  85.        allows fast access. The precompiled form of a library includes a
  86.        library name, a hash table containing all the names of user words,
  87.        a link table in routine number order with execution addresses of
  88.        all routines, an optional message table containing all the
  89.        messages for use by the error handler, and a configuration routine
  90.        which lets the library do something at configuration time
  91.        (whenever a System Halt occurs). It also contains a checksum that
  92.        the HP 48 uses to verify if the library is valid or not (Warning:
  93.        Invalid Card Data).  The tool MAKEROM is used to build the various
  94.        tables. A SLOAD command creates the checksum.
  95.  
  96.        Libraries must be address-independent, because they can reside
  97.        anywhere in ports 0, 1, or 2. To be address-independent, all
  98.        references to library routines is done through a rom pointer.  A
  99.        rom pointer is an RPL object with a 5-nibble prologue (DOROMP) and
  100.        a 6-nibble body containing the rom id (called Library ID to users)
  101.        and the routine number within the library. When a library routine
  102.        is called, the mainframe determines if the rom is present in the
  103.        system, and if so, determines the address of that routine and
  104.        transfers control to it, thereby recognizing the fact that the
  105.        routine's actual address is unknown until the moment the routine
  106.        is called.
  107.  
  108.        Three things tell the RPL compiler to turn references to library
  109.        routines into rom pointers. First, the compiler directive xROMID
  110.        says to compile certain routines for external ROMs (libraries)
  111.        rather than for a HP 48 built-in ROM. Second, all library routines
  112.        must be declared with xNAME (or sNAME) for named user words or
  113.        NULLNAME for unnamed words -- NAMELESS is not allowed. Third, the
  114.        compiler directive EXTERNAL identifies which of the NULLNAMEd
  115.        routines are to be subject to compilation as romptrs.
  116.  
  117.        Routines that are not declared EXTERNAL will be compiled as object
  118.        pointers.
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.                                    -2-
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.        Assembly language must be bounded by the CODE...ENDCODE directives
  141.        in order to be address-independent. No statements like CON(5)
  142.        (*)+5 are allowed, because they are loaded at a specific address.
  143.        Moving that code to a different address will then fail. CON
  144.        statements can only be used for values, not for addresses.
  145.        Addresses can be referenced by REL statements.
  146.  
  147.        The process of generating a library object with MAKEROM is not a
  148.        trivial one, so the file structure and procedures that have been
  149.        used by HP and other developers for such projects as the HP 82211A
  150.        Equation Library Card or the HP 48 Programmer's ToolKit will be
  151.        illustrated here.
  152.  
  153.        The order of events is:
  154.  
  155.  
  156.           + Compile and assemble the source
  157.  
  158.           + Use MAKEROM to create the head, hash, end, and loader control
  159.             files
  160.  
  161.           + Use the loader to build the library from the output files
  162.             generated by MAKEROM in combination with your code
  163.  
  164.           + Use the loader to add a binary download header to the front
  165.             of the library and fill in the system references.
  166.  
  167.        A naming convention is used to lend some organization to all the
  168.        files that comprise a completed library.  A unique two-letter
  169.        prefix is used to separate one library from others, and the file
  170.        extension is used to indicate the type of a file.  For instance,
  171.        in the Equation Library card project, the prefix PT was used for
  172.        the Periodic Table library, CO was used for the Constants library,
  173.        BR was used for the browser, etc.  The two-letter prefix is also
  174.        used to name internal routines within the library.  This is done
  175.        to help separate one library's routines from another.
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.                                    -3-
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.        The file extensions are defined as follows:
  207.  
  208.          EXTENSION   MEANING
  209.          ---------   --------------------------------------------
  210.             .A       Saturn assembler source file
  211.             .EXT     External list generated by RPLCOMP
  212.             .H       Include file, used by RPLCOMP or SASM
  213.             .L       Saturn assembler list file
  214.             .LR      SLOAD output list file
  215.             .M       SLOAD control file
  216.             .MN      MAKEROM control file
  217.             .O       Saturn object code file (with Saturn header)
  218.             .OL      Loader output file
  219.             .S       RPL source file
  220.  
  221.        A series of internal RPL source files are used to create a
  222.        complete library object.  Since a large number of files will
  223.        eventually be involved, an example will be used to walk through
  224.        the process.  The example library object will contain two user
  225.        words, which will be kept to an absurd simplicity so that
  226.        attention may be kept on the file structures.  The file structure
  227.        in this example is more complex than is needed, however the intent
  228.        is to illustrate a structure suitable for more involved
  229.        applications.
  230.  
  231.        The prefix letters GE will be used in this example to keep the
  232.        "geometry library" distinct from other projects and to prefix the
  233.        names of the internal routines in the library.
  234.  
  235.        This is the batch file that builds the example library:
  236.  
  237.             RPLCOMP GEUSER.S GEUSER.A GEUSER.EXT
  238.             SASM GEUSER
  239.  
  240.             RPLCOMP GEMAIN.S GEMAIN.A GEMAIN.EXT
  241.             SASM GEMAIN
  242.  
  243.             RPLCOMP GESUBS.S GESUBS.A GESUBS.EXT
  244.             SASM GESUBS
  245.  
  246.             RPLCOMP GECFG.S GECFG.A GECFG.EXT
  247.             SASM GECFG
  248.  
  249.             MAKEROM GE.MN GE.M
  250.             SASM GEHEAD
  251.             SASM GEHASH
  252.             SASM GEEND
  253.  
  254.             SLOAD GE.M
  255.             SLOAD -H G.M
  256.  
  257.  
  258.  
  259.  
  260.                                    -4-
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.        The example contains two words, ACONE and VCONE.  The files that
  273.        are used to build the library object are:
  274.  
  275.             Group 1
  276.             ----------
  277.             GEROMID.H       ROM ID include file
  278.             GEEXTDEC.H      External declaration include file
  279.  
  280.             Group 2
  281.             ----------
  282.             GECFG.S         Library configuration code
  283.             GEUSER.S        User words
  284.             GEMAIN.S        Dispatchees of user words
  285.             GESUBS.S        Subroutines
  286.  
  287.             Group 3
  288.             ----------
  289.             GE.MN           MAKEROM input file
  290.             G.M             Loader control file
  291.  
  292.             MAKEGEO.BAT     Batch file to do it all
  293.  
  294.        The files in group 1 are very important.  The first file,
  295.        GEROMID.H, contains an xROMID instruction that tells the RPL
  296.        compiler what library number is being used, and an assembler ROM
  297.        ID equate that's used in the configuration source code:
  298.  
  299.          * Geometry Library ROM ID include file.  This file should
  300.          * be included in all source modules.  Library ID numbers
  301.          * in this file are expressed in hex.
  302.  
  303.          *** NOTE THAT THERE ARE TWO ENTRIES TO CHANGE IF THE
  304.          *** LIBRARY ID CHANGES
  305.  
  306.          xROMID 2FC
  307.  
  308.          ASSEMBLE
  309.  
  310.          GEROMID EQU #2FC
  311.  
  312.        This file is included in every RPL source file - those files
  313.        ending with the ".S" extension.  If the romid is to be changed,
  314.        only this file will need to be edited to affect a complete change
  315.        of the romid (after re-compiling and assembling everything, of
  316.        course).  A "make" utility would be useful here.
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.                                    -5-
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.        The second file in group 1, GEEXTDEC.H, contains the external
  339.        declarations.
  340.  
  341.                  TITLE Geometry External Declarations
  342.          *****************************************************************
  343.          * Geometry Library external declarations file.  This file should
  344.          * be included in all source modules.  These external declarations
  345.          * are listed in alphabetical order, but there is no requirement
  346.          * about ordering.
  347.          *****************************************************************
  348.  
  349.          EXTERNAL GEDoACone
  350.          EXTERNAL GEDoVCone
  351.          EXTERNAL GEtimesPI
  352.  
  353.        Each routine in the RPL source files must be declared with
  354.        NULLNAME, so that the compiler will generate a ROM pointer call
  355.        (XLIB call) for that routine instead of a call-by-address (system
  356.        call).  Names may contain up to 11 characters.  This file is
  357.        included in every RPL source file.  By centralizing the external
  358.        declarations in one file, between-file calls are not at risk from
  359.        a missing external declaration.
  360.  
  361.  
  362.  
  363.  
  364.  
  365.  
  366.  
  367.  
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.                                    -6-
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.        The source files in group 2 above contain the configuration code,
  405.        the user words, and the remaining code for the application.  Note
  406.        that each file in group 2 "INCLUDEs" both files in group 1.
  407.  
  408.        The configuration code contains one label that is not NULLNAMEed,
  409.        because it is referenced by a relative address in the header file
  410.        GEHEAD.S, to be discussed below.  The configuration code is
  411.        executed as part of a series of events that happen when a System
  412.        Halt is performed:
  413.  
  414.  
  415.                  TITLE Geometry Library Configuration
  416.  
  417.          INCLUDE GEROMID.H
  418.          INCLUDE GEEXTDEC.H
  419.  
  420.          *****************************************************************
  421.          * Add the Geometry Library ROMPART to the SYSRAMROMPAIR.
  422.          * The following construction of a binary integer is used
  423.          * to enable use of the GEROMID equate defined in GEROMID.H.
  424.          *
  425.          * NOTE: The label GEcfg is only referenced via a relative address
  426.          * in the header file GEHEAD so it is being made a "NAMELESS".
  427.          * If it was going to be referenced from a secondary then it would
  428.          * need to changed to a "NULLNAME" so that the reference would be
  429.          * made via a romptr.
  430.          *****************************************************************
  431.  
  432.          ASSEMBLE
  433.          =GEcfg
  434.          RPL
  435.          ::
  436.            DOBINT GEROMID
  437.            XEQSETLIB             ( autoattach )
  438.          ;
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.                                    -7-
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.        The user words are consolidated into one file, in this case
  471.        GEUSER.S:
  472.  
  473.                  TITLE Geometry Library User Words
  474.  
  475.          INCLUDE GEROMID.H
  476.          INCLUDE GEEXTDEC.H
  477.  
  478.          *****************************************************************
  479.          * The user module contains the "xNames" - the user words.  These
  480.          * will be visible to the user.  The nibble that precedes each
  481.          * xName tells the parser that this is a non-algebraic.  Note that
  482.          * the user words are specified with the compiler directive
  483.          * "xNAME".
  484.          *****************************************************************
  485.          ASSEMBLE
  486.                  CON(1)  8
  487.          RPL
  488.          xNAME ACONE
  489.          ::
  490.            CK2&Dispatch REALREAL ( real real ) GEDoACone
  491.          ;
  492.          *****************************************************************
  493.          ASSEMBLE
  494.                  CON(1)  8
  495.          RPL
  496.          xNAME VCONE
  497.          ::
  498.            CK2&Dispatch REALREAL ( real real ) GEDoVCone
  499.          ;
  500.          *****************************************************************
  501.  
  502.        There is no requirement that all the user words reside in one
  503.        file, but there is an advantage.  First, the user words (denoted
  504.        by an xNAME instead of a NULLNAME declaration) will appear in the
  505.        library menu in the order that the MAKEROM tool encounters them.
  506.        Secondly placing all the user words in one file you control their
  507.        order and avoid re-compiling the "check and dispatch" code if only
  508.        other parts of the code are being changed.
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.                                    -8-
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.        The dispatchees of the user words may be in one or more files, to
  537.        the taste of the developer.  In this example, the file GEMAIN.S
  538.        contains the dispatchees of the user words:
  539.  
  540.                  TITLE Geometry Library Main Module
  541.  
  542.          INCLUDE GEROMID.H
  543.          INCLUDE GEEXTDEC.H
  544.  
  545.          *****************************************************************
  546.          * The main module contains the dispatchees of the user words.
  547.          * Each routine is named with a NULLNAME compiler directive, and
  548.          * has a corresponding entry in the external declarations file.
  549.          *****************************************************************
  550.          NULLNAME GEDoACone ( %radius %height --> %area )
  551.          * Calculates the area of a cone given its radius and height
  552.          ::
  553.            DUP %* OVER DUP %*            ( r h^2 r^2 --> )
  554.            DUPROT %+ %SQRT               ( r r^2 SQRT[r^2+h^2] --> )
  555.            ROT GEtimesPI %*              ( r^2 PI*r*SQRT[r^2+h^2] --> )
  556.            SWAP GEtimesPI %+             ( %area )
  557.          ;
  558.          *****************************************************************
  559.          NULLNAME GEDoVCone ( %radius %height --> %volume )
  560.          * Calculates the volume of a cone given its radius and height
  561.          ::
  562.            OVER %* %*
  563.            GEtimesPI %3 %/
  564.          ;
  565.          *****************************************************************
  566.  
  567.  
  568.        The file GESUBS.S contains a routine common to both user word
  569.        dispatchees:
  570.  
  571.                  TITLE Geometry Library Subroutine Module
  572.  
  573.          INCLUDE GEROMID.H
  574.          INCLUDE GEEXTDEC.H
  575.  
  576.          *****************************************************************
  577.          * The main module contains the subroutines for the user words.
  578.          * Each routine is named with a NULLNAME compiler directive, and
  579.          * has a corresponding entry in the external declarations file.
  580.          *****************************************************************
  581.          NULLNAME GEtimesPI ( % --> %*PI )
  582.          * Multiplies real number by PI
  583.          ::
  584.            %PI %*
  585.          ;
  586.          *****************************************************************
  587.  
  588.  
  589.  
  590.                                    -9-
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.        The experienced programmer will note that this use of a subroutine
  603.        in the file GESUBS.S creates more overhead than is needed - the
  604.        example is here to emphasize file structures.
  605.  
  606.        When the source files are compiled with RPLCOMP, it is important
  607.        to make sure that the external declarations are generated. For
  608.        instance, compile the source files as follows:
  609.  
  610.                       RPLCOMP GEUSER.S GEUSER.A GEUSER.EXT
  611.  
  612.        The files in Group 3 are control files for the tools MAKEROM and
  613.        SLOAD.  The MAKEROM tool reads the file GE.MN, and generates a new
  614.        loader control file, GE.M.  MAKEROM is invoked as follows:
  615.  
  616.                         MAKEROM <inputfile> <outputfile>
  617.  
  618.        In this example, the invocation would be:
  619.  
  620.                                MAKEROM GE.MN GE.M
  621.  
  622.        Let's take a careful look at the MAKEROM input file GE.MN:
  623.  
  624.          TITLE Geometry Library
  625.          OUTPUT GE.O
  626.          LLIST GE.LR
  627.          CONFIGURE GEcfg
  628.          NAME GELIB :Geometry Libr
  629.          ROMPHEAD GEHEAD.A
  630.          REL GEUSER.O
  631.          REL GEMAIN.O
  632.          REL GESUBS.O
  633.          REL GECFG.O
  634.          TABLE GEHASH.A
  635.          FINISH GEEND.A
  636.          END
  637.  
  638.        The first line contains a title command for the list files.  The
  639.        OUTPUT command directs the Saturn output code to the file GE.O.
  640.        The LLIST command directs the corresponding list report generated
  641.        by the loader to the file GE.LR.  The CONFIGURE command references
  642.        the label in the configuration code (file GECFG.S).  The NAME
  643.        command is followed by the label text for the library.  This text
  644.        appears in two places:
  645.  
  646.  
  647.         + A menu label in the library menu.  To correspond with other
  648.           library names, the name should be short enough to fit in a menu
  649.           label, followed by a space and whatever text you like.
  650.  
  651.         + In the HP 48 display when the you press [left][LIBRARY], then
  652.           [left][REVIEW].
  653.  
  654.  
  655.  
  656.                                    -10-
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.  
  665.  
  666.  
  667.  
  668.        The Equation Library Card libraries use five letters, followed by
  669.        a space, colon, and text, and this example follows that pattern:
  670.  
  671.                EQLIB :Equation Libr
  672.                PRTBL :Periodic Table
  673.                COLIB :Constants Libr
  674.                FIN   :Finance
  675.                MES   :Mult Eqn Solver
  676.                UTILS :Utilities
  677.                GELIB :Geometry Libr
  678.  
  679.        It is important to preserve the order of the commands,
  680.        particularly the relative positions of the ROMPHEAD, REL, TABLE,
  681.        and FINISH commands.
  682.  
  683.        The ROMPHEAD command specifies the name of the header file to be
  684.        generated by MAKEROM.  The REL commands list all the output
  685.        modules you have created by compiling and assembling the RPL
  686.        source files.  The TABLE and FINISH commands specify the hash
  687.        table file and rompart-end files that will be created by MAKEROM.
  688.  
  689.        The three files generated by MAKEROM must be assembled before the
  690.        next step.  The files generated in this example are GEHEAD.A,
  691.        GEHASH.A, and GEEND.A.
  692.  
  693.        This is the loader control file GE.M generated by MAKEROM:
  694.  
  695.          TITLE Geometry Library
  696.          OUTPUT GE.O
  697.          LLIST GE.LR
  698.          **CONFIGURE GEcfg
  699.          **NAME GELIB :Geometry
  700.          **ROMPHEAD GEHEAD.A
  701.          REL GEHEAD.o
  702.          REL GEUSER.O
  703.          REL GEMAIN.O
  704.          REL GESUBS.O
  705.          REL GECFG.O
  706.          ** Could not open GECFG.ext
  707.          **TABLE GEHASH.A
  708.          REL GEHASH.o
  709.          **FINISH GEEND.A
  710.          REL GEEND.o
  711.          END
  712.  
  713.        There are no external routines in GECFG.S, so an external file was
  714.        not created.  The messsage "Could not open GECFG.ext" is therefore
  715.        harmless.
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.                                    -11-
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.        Running SLOAD with the new loader control file GE.M produces a
  735.        rompart which is ready to link to the HP 48 internal routines.
  736.        This last step is accomplished with another loader control file,
  737.        G.M:
  738.  
  739.          TITLE Geometry Library
  740.          OUTPUT GEOLIB
  741.          OPTION CODE
  742.          LLIST GEOLIB.LR
  743.          SUPPRESS XR
  744.          SEARCH \INCLUDE\ENTRIES.O
  745.          REL \INCLUDE\BINHD.O
  746.          REL GE.O
  747.          CK LIB2FC SYSEND2FC
  748.  
  749.        When SLOAD is invoked for this control file, it is important to
  750.        use the -H option in the command line.  This ensures that a code
  751.        file will be generated, and not a Saturn object file (which
  752.        includes a header and symbol table).  The SEARCH command instructs
  753.        the loader to read the HP 48 system entries so that the references
  754.        to internal routines may be filled in.  The REL command for the
  755.        file BINHD.O is the command to include the binary download header.
  756.        The rompart is filled in next, and the last command fills in the
  757.        library checksum.
  758.  
  759.        The source for the binary download header is not too complex:
  760.  
  761.                NIBASC  /HPHP48-A/
  762.  
  763.        Just assemble the file and place the resulting BINHD.O file in a
  764.        convenient place to include it in your projects.
  765.  
  766.        The output of the final load, in this case the file GEOLIB, is now
  767.        ready to download to the HP 48.
  768.  
  769.        Guaranteeing proper behavior of a library in all ports can be
  770.        troublesome.  When a "make" tool is used to manage recompilations,
  771.        the dependencies in the makefile are such that any change to
  772.        either the library ID or the external declarartions forces a
  773.        recompile of all source files in the library, ensuring that all
  774.        references are compiled as rom pointers with the proper library
  775.        ID.  Every time a new routine is added, add the corresponding
  776.        external declaration to the externals file.
  777.  
  778.        The quickest way to verify address-independence is to look in the
  779.        .lr file (in this case, GE.lr). A reference to a library routine
  780.        that is address- independent will have two addresses after its
  781.        name in the cross reference: one for the routine's definition
  782.        (where the NULLNAME is) and one for its entry in the link table.
  783.  
  784.  
  785.  
  786.  
  787.  
  788.                                    -12-
  789.  
  790.  
  791.  
  792.  
  793.